﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MS.InformationManagement.Core.Support;
using MS.InformationManagement.Support.Constants;
using Microsoft.Office.DocumentManagement.DocumentSets;
using Microsoft.SharePoint;
using MS.InformationManagement.Support;

namespace MS.InformationManagement.BLL.ExcludeExpediente
{
    public class ExcludeExpediente
    {

        public void ExcludeRadicadoFromExpediente(string listId, string radicadoId, string expedienteListName)
        {
            Guid listName = new Guid(expedienteListName);
            var radicado = RadicadosHelper.GetRadicadoById(radicadoId, listName);
            if (radicado.Item[CustomSiteColumns.FIELD_DOCSET_ATTACHED_DOCUMENTS] != null)
                throw new Exception("Este radicado no se puede excluir del expediente ya que tiene antecedentes asociados");

            if (radicado.Item[CustomSiteColumns.FIELD_EXPEDIENTE_ID].ToString().Replace("-E", "") == radicado.Item[CustomSiteColumns.FIELD_DOCUMENT_RADICADO].ToString())
                throw new Exception("Este radicado no se puede excluir del expediente ya que el expediente hereda el nombre de este radicado");

            SPContentTypeId currentContentType = radicado.ContentType.Id;
            if (radicado.ContentType.Name == GlobalConstants.CTTN_RADICADO_INTERNO)
                ExcludeRadicadoInterno(radicado, expedienteListName);
            else
                MoveRadicadoToList(radicado, listId, currentContentType);
        }

        private void ExcludeRadicadoInterno(DocumentSet radicado, string expedienteListName)
        {
            //Obtener expediente
            var expediente = RadicadosHelper.getExpedienteById(radicado.Folder.Item[CustomSiteColumns.FIELD_EXPEDIENTE_ID].ToString(),expedienteListName);
           
            //Obtener radicados - Eliminar radicados
            SPListItemCollection foundedLinks = RadicadosHelper.GetDocumentLinkInExpedienteById(expediente,radicado.Item.ID,radicado.Item.ParentList.Title);
            foundedLinks[0].Delete();
            
            //Quitar el expediente del radicado
            radicado.Folder.Item[CustomSiteColumns.FIELD_EXPEDIENTE_ID] = null;
            radicado.Log(string.Empty, DateTime.Now, Support.Enums.TraceableOperation.Excluir, SPContext.Current.Web.CurrentUser.LoginName, string.Format("Se excluyó el radicado del expediente {0}", radicado.Folder.Item[CustomSiteColumns.FIELD_EXPEDIENTE_ID].ToString()));
            radicado.Folder.Item.Update();
            radicado.Folder.Update();
            
        }

        private void MoveRadicadoToList(DocumentSet radicado, string targetListName, SPContentTypeId contentType)
        {
            radicado.Folder.Item[CustomSiteColumns.FIELD_EXPEDIENTE_ID] = null;
            radicado.Log(string.Empty, DateTime.Now, Support.Enums.TraceableOperation.Excluir, SPContext.Current.Web.CurrentUser.LoginName, string.Format("Se excluyó el radicado del expediente {0}", radicado.Folder.Item[CustomSiteColumns.FIELD_EXPEDIENTE_ID].ToString()));
            radicado.Folder.Item[CustomSiteColumns.FIELD_CURRENT_ACTION] = "MoveTo";
            radicado.Folder.Item.Update();
            radicado.Folder.Update();
            radicado.Folder.MoveTo(targetListName + "/" + radicado.Folder.Name);
            this.UpdateContentType(contentType, targetListName, radicado.Folder.Item.ID);
        }

        protected void UpdateContentType(SPContentTypeId contentType, string targetListName, int itemId)
        {
            SPFolder currentFolder = SPContext.Current.Web.Lists.TryGetList(targetListName).GetItemById(itemId).Folder;
            currentFolder.Item[SPBuiltInFieldId.ContentTypeId] = contentType;
            currentFolder.Item.Update();
            currentFolder.Update();
        }

    }
}
